/**
 * 
 */
package com.cupdata.ch5.volatile_static;

/**
 * 双重检查的加锁的方法可以大大滴减少getInstance()的时间耗费。
 * @author Minsk
 *
 * @since  2017年4月19日
 */
public class Singleton {
	//volatile关键字确保：当uniqueInstance变量被初始化成Singleton实例时，
	//	多个线程正确的处理uniqueInstance
	private volatile static Singleton uniqueInstance;
	private Singleton() {}
	//检查实例，如果不存在，就进入同步区块
	public static Singleton getInstance() {
		//只有第一次才彻底执行这里的代码
		if (uniqueInstance == null) {
			//进入区块后，再检查一次。如果仍是null，才创建实例
			synchronized (Singleton.class) {
				if (uniqueInstance == null) {
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}
